<?php

/**
 * @description: mysql 跟 redis 一起操作
 */
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Request;
use App\Http\Controllers\redis\RedisController as Redis;  //redis 缓存


if (!function_exists('redis_mysql_add')) {

    /**
     * @description: redis mysql同时添加 redis key为表名_+$id  时间表一定有 update_time,create_time,id 字段
     * @param string        $tableName      数据库表名
     * @param array|string  $checkRepeat    是否需要判断重复  字符串时为单条件 数组为多条件
     * @param array|string  $needMd5        需要MD5   加密的字段
     * @param string        $id             更改redis key的贮存字段 一般为id不重复
     * @return {*}
     */
    function redis_mysql_add($tableName, $checkRepeat = '', $needMd5=false, $id='id')
    {
        if (Request::has('formData')) {
            $formData = Request::input('formData');
            $res=  redis_mysql_add_return($tableName, $formData, $checkRepeat, $needMd5, $id);
            return   $res? toJson(200, '添加成功', array('id'=>$res)):toJson(100, '添加失败');
        } else {
            return missingParameter();
        }
    }
}
if (!function_exists('mysql_checkRepeat')) {

    /**
     * @description: 数据库里是否有一个字段和表单字段重复
     * @param   string        $tableName   表名
     * @param   array         $formData    表单数据
     * @param   array|string  $checkRepeat 检查重复的字段 array时为多字段判断是否重复 string时为单字段
     * @return  bool          $check       false为重复  true为不重复
     */

    function mysql_checkRepeat($tableName, $formData, $checkRepeat)
    {
        $check = true;
        if (!empty($checkRepeat)) {
            $tmp = [];
            if (is_array($checkRepeat)) {
                foreach ($checkRepeat as $val) {
                    if (!array_key_exists($val, $formData)) {
                        return  toJson(100, 'checkRepeat参数错误');
                    } else {
                        $tmp[$val] =  $formData[$val];
                    }
                }
            } elseif (is_string($checkRepeat)) {
                if (array_key_exists($checkRepeat, $formData)) {
                    $tmp[$checkRepeat] = $formData[$checkRepeat];
                } else {
                    return toJson(100, 'checkRepeat参数错误');
                }
            }
            $res= Db::table($tableName)->whereOr($tmp)->where('show', 1)->select()->first();
            if (!empty($res)) {
                $check = false;   //是否有重复 false为重复
            }
        }
        return $check;
    }
}





if (!function_exists('redis_mysql_edit')) {
    /**
      * @description: redis mysql同时修改 redis key为表名_+$id  时间表一定有 update_time,id 字段
      * @param string        $tableName      数据库表名
      * @param array|string  $checkRepeat    是否需要判断重复  字符串时为单条件 数组为多条件
      * @param array|string  $needMd5        需要MD5   加密的字段
      * @return {*}
      */
    function redis_mysql_edit($tableName, $checkRepeat = '', $needMd5=false)
    {
        if (Request::has('formData')&&Request::has('conditions')) {
            $conditions = Request::input('conditions');
            $formData = Request::input('formData');
            
            $res=  redis_mysql_edit_return($tableName, $conditions, $formData, $checkRepeat, $needMd5);
            return  $res?toJson(200, '修改成功'):   toJson(100, '修改失败');
        } else {
            return missingParameter();
        }
    }
}
if (!function_exists('redis_mysql_selone')) {

    /**
     * @description:       单条数据查询
     * @param    string             $tableName 表名
     * @param    string|array|bool  $filed     string时为取单个 array为取多个 false 为全拿出来
     * @return   array              $res       查询出的数据
     */
    function redis_mysql_selone($tableName, $filed=false)
    {
        if (Request::has('id')) {
            $id = Request::input('id');
            $res= redis_mysql_selone_return($tableName,  $id,$filed);
            return toJson(200, '查询成功', $res);
        } else {
            return missingParameter();
        }
    }
}




if (!function_exists('redis_mysql_selone_return')) {
    /**
       * @description: 不需要redis_mysql_selone结束时调用该函数
       */
 
    function redis_mysql_selone_return($tableName, $id ,$filed=false)
    {
        if (Redis::existSKey($tableName.'_'.$id)) {
            if (!$filed) {
                $res=Redis::redishGetAll($tableName.'_'.$id);
            } elseif (is_string($filed)) {
                $res[$filed]=Redis::hGET($tableName.'_'.$id, $filed);
            } elseif (is_array($filed)) {
                $res=Redis::hMget($tableName.'_'.$id, $filed);
            }
        } else {
            $tableSource= Db::table($tableName)->where('id', $id)->select()->first();
            if (!empty($tableSource)) {
                Redis::hMset($tableName.'_'.$id, $tableSource);
                if (!$filed) {
                    $res=Redis::redishGetAll($tableName.'_'.$id);
                } elseif (is_string($filed)) {
                    $res[$filed]=Redis::hGET($tableName.'_'.$id, $filed);
                } elseif (is_array($filed)) {
                    $res=Redis::hMget($tableName.'_'.$id, $filed);
                }
            } else {
                $res = [];
            }
        }
        // var_dump($res);
        return $res;
    }
}
if (!function_exists('redis_mysql_add_return')) {
    /**
     * @description: 不需要redis_mysql_add结束时调用该函数
     */
    function redis_mysql_add_return($tableName, $formData, $checkRepeat = '', $needMd5=false, $id='id',$die = true)
    {
        if ($needMd5) {
            if (is_array($needMd5)) {
                foreach ($needMd5 as $val) {
                    if (array_key_exists($val, $formData)) {
                        $formData[$val] =  md5($formData[$val]);
                    }
                }
            } elseif (is_string($needMd5)) {
                if (array_key_exists($needMd5, $formData)) {
                    $formData[$needMd5] =  md5($formData[$needMd5]);
                }
            }
        }
        
        $check=  mysql_checkRepeat($tableName, $formData, $checkRepeat);
        if ($check) {
            $now = date('Y-m-d H:i:s');
            $formData['update_time'] = $now;  //数据表一定要有该字段   修改时间
            $formData['create_time'] = $now;  //数据表一定要有该字段   创建时间
            $res =   Db::table($tableName)->insertGetId($formData) ;
            if ($res) {
                $array=Db::table($tableName)->where('id', $res)->select()->first();
                // if (!array_key_exists($id, $array)) {
                //     toJson(100, '没有$id字段作为redis key');
                // }
                Redis::hMset($tableName.'_'.$array[$id], $array);
                return  $res;
            } else {
                if($die){
                    return toJson(100, '添加失败');
                }else{
                    return false;
                }
               
            }
        } else {
            return  toJson(100, '资料已被注册');
        }
    }
}

if (!function_exists('redis_mysql_add_manual')) {
   
   /**
    * @description:  自定义添加
    * @param  string $tableName    下划线第一个一定要是表名
    * @param  array  $formData     数据
    * @return int    $res          id
    */
    function redis_mysql_add_manual($tableName, $formData)
    {
        $table_arr = explode('_', $tableName);
        //assert(count($table_arr) > 1);
        $formData['update_time'] = date('Y-m-d H:i:s');
        $formData['create_time'] = date('Y-m-d H:i:s');
        $res=  Db::table($table_arr[0])->insert($formData);
        if ($res) {
            Redis::hMset($tableName, $formData);
        }
        return $res;
    }
}

if (!function_exists('redis_mysql_edit_manual')) {
    /**
     * @description:  自定义修改
     * @param  string       $tableName    下划线第一个一定要是表名
     * @param  array        $formData     数据
     * @param  int|array    $id           修改条件
     * @return int          $res          id
     */
    function redis_mysql_edit_manual($tableName, $formData, $id)
    {
        $table_arr = explode('_', $tableName);
        //assert(count($table_arr) > 1);
        if (!Redis::existSKey($tableName)) {
            $data= is_array($id)? Db::table($table_arr[0])->where($id)->select()->first():Db::table($table_arr[0])->where('id', $id)->select()->first();
            Redis::hMset($tableName, $data);
        }
        $formData['update_time'] = date('Y-m-d H:i:s');
        $res= is_array($id)? Db::table($table_arr[0])->where($id)->update($formData):Db::table($table_arr[0])->where('id', $id)->update($formData);
        if ($res) {
            Redis::hMset($tableName, $formData);
        }
        return $res;
    }
}




 if (!function_exists('redis_mysql_selone_manual')) {
     /**
      * @description:  查单条
      * @param  string      $tableName   redis查询key  表名_
      * @param  bool|array  $filed      false查全部
      * @param  int|array   $id         查询条件
      * @return array       $res
      */
     function redis_mysql_selone_manual($tableName,  $id,$filed = false)
     {
         $table_arr = explode('_', $tableName);
         //assert(count($table_arr) > 1);
         if (!Redis::existSKey($tableName)) {
             $data=   is_array($id)?Db::table($table_arr[0])->where($id)->select()->first():Db::table($table_arr[0])->where('id', $id)->select()->first();
             if ($data) {
                 Redis::hMset($tableName, $data);
             } else {
                 return false;
             }
         }
         $res= !$filed? Redis::redishGetAll($tableName):Redis::hMget($tableName, $filed);
         return $res;
     }
 }


 
 






if (!function_exists('redis_mysql_edit_return')) {
    /**
     * @description: 不需要redis_mysql_edit结束时调用该函数
     */
    function redis_mysql_edit_return($tableName, $conditions, $formData, $checkRepeat = '', $needMd5=false, $die = false, $conditionsNo = true)
    {
        // var_dump($conditions);
        // var_dump($formData);
        if (!array_key_exists('id', $conditions)) {
            return toJson(100, 'conditions缺少id字段');  //必须有id字段
        }
        if ($needMd5) {
            if (is_array($needMd5)) {
                foreach ($needMd5 as $val) {
                    if (array_key_exists($val, $formData)) {
                        $formData[$val] =  md5($formData[$val]);
                    }
                }
            } elseif (is_string($needMd5)) {
                if (array_key_exists($needMd5, $formData)) {
                    $formData[$needMd5] =  md5($formData[$needMd5]);
                }
            }
        }
        $check=   mysql_checkRepeat($tableName, $formData, $checkRepeat);
        if ($check) {
            $now = date('Y-m-d H:i:s');
            $formData['update_time'] =  $now;   //表必须有id update_time字段
            $res=  Db::table($tableName)->where($conditions)->update($formData);
            // echo Db::getLastSQL();
            if ($res) {
                if (Redis::existSKey($tableName.'_'.$conditions['id'])) {     //判断redis是否存在 存在直接改值
                    $res=  Redis::hMset($tableName.'_'.$conditions['id'], $formData);
                } else {
                    if ($conditionsNo) {
                        $find= Db::table($tableName)->where($conditions)->select()->first();         //不存在先查再存
                        if($find){
                            $res=  Redis::hMset($tableName.'_'.$conditions['id'], $find);

                        }else{
                            if ($die) {
                                return  toJson(100, '查询错误');
                            } else {
                                return  false;
                            }
                        }

                    } elseif (isset($conditions['id'])) {
                        $find= Db::table($tableName)->where(['id'=>$conditions['id']])->select()->first();         //不存在先查再存
                        $res=  Redis::hMset($tableName.'_'.$conditions['id'], $find);
                    } else {
                        return  toJson(100, '参数异常');
                    }
                }
                return $res;
            } else {
                if ($die) {
                    return  toJson(100, '修改失败');
                } else {
                    return  false;
                }
            }
        } else {
            return  toJson(100, '资料已被注册');
        }
    }
}


if (!function_exists('redis_mysql_edit_in')) {
    /**
     * @description:  批量修改
     * @param  string  $tableName 表名
     * @param  array   $idArr     1,2,3   必须为id
     * @param  array   $formData  修改数组
     * @param  array   $whereAnd  条件
     * @param  array   $redisOp   删除缓存还是修改缓存
     * @return bool
     */
    function redis_mysql_edit_in($tableName, $idArr, $formData, $whereAnd = [], $redisOp = 'edit')
    {
        $formData['update_time'] = date('Y-m-d H:i:s');
        $res = Db::table($tableName)->whereIn('id', $idArr);
        if (!empty($whereAnd)) {
            $res=    $res->where($whereAnd);
        }
        $res= $res->update($formData);
        if ($res) {
            // $idArr =    explode(',', $idStr);
            if($redisOp !== 'none'){
                \co::create(function() use($tableName,$redisOp,$idArr,$formData) { 
                    Swoole\Coroutine\System::sleep(0.2);
                    if ($redisOp === 'edit') {
                        for ($i=0;$i<count($idArr);$i++) {
                            if (Redis::existSKey($tableName.'_'.$idArr[$i])) {
                                $res=  Redis::hMset($tableName.'_'.$idArr[$i], $formData);
                            } else {
                                $res= Db::table($tableName)->where('id', $idArr[$i])->select()->first();
                                if ($res) {
                                    $res=  Redis::hMset($tableName.'_'.$idArr[$i], $res);
                                }
                            }
                        }
                    } elseif ($redisOp === 'del') {
                        for ($i=0;$i<count($idArr);$i++) {
                            $res=  Redis::del($tableName.'_'.$idArr[$i]);
                        }
                    }
                });
            }
           



            return true;
        } else {
            return false;
        }
    }
}


if (!function_exists('redis_mysql_del')) {
    /**
     * @description:  删除键值
     * @param  string  $tableName 表名
     * @param  string  $id        必须为id
     * @return bool
     */
    function redis_mysql_del($tableName, $id)
    {
        if (Redis::existSKey($tableName.'_'.$id)) {
            Redis::del($tableName.'_'.$id);
        }
    }
}

